Generates Decorator pattern for PHP 8.4. Creates wrapper classes for dynamic behavior addition without inheritance. Includes unit tests.
From accnpx claudepluginhub dykyi-roman/awesome-claude-code --plugin accThis skill uses the workspace's default tool permissions.
references/examples.mdreferences/templates.mdCreates Decorator pattern infrastructure for dynamically adding behavior to objects.
| Scenario | Example |
|---|---|
| Cross-cutting concerns | Logging, caching, metrics |
| Transparent wrapping | Add behavior without changing interface |
| Stackable features | Multiple decorators combined |
| Runtime behavior | Dynamic feature addition |
Path: src/Domain/{BoundedContext}/
{Name}Interface.php — Core operations contractPath: src/Domain/{BoundedContext}/Decorator/
Abstract{Name}Decorator.php — Base decorator with delegationPath: src/Infrastructure/{BoundedContext}/Decorator/
Logging{Name}Decorator.php — Logging behaviorCaching{Name}Decorator.php — Caching behaviorMetrics{Name}Decorator.php — Performance metricsTransactional{Name}Decorator.php — Transaction wrappingPath: src/Infrastructure/{BoundedContext}/
{Name}Factory.php — Stack decorators in correct order{Feature}{Name}DecoratorTest.php — Individual decorator tests| Component | Path |
|---|---|
| Interface | src/Domain/{BoundedContext}/ |
| Abstract Decorator | src/Domain/{BoundedContext}/Decorator/ |
| Infrastructure Decorators | src/Infrastructure/{BoundedContext}/Decorator/ |
| Factory | src/Infrastructure/{BoundedContext}/ |
| Unit Tests | tests/Unit/Infrastructure/{BoundedContext}/Decorator/ |
| Component | Pattern | Example |
|---|---|---|
| Interface | {Name}Interface | OrderServiceInterface |
| Abstract Decorator | Abstract{Name}Decorator | AbstractOrderServiceDecorator |
| Concrete Decorator | {Feature}{Name}Decorator | LoggingOrderServiceDecorator |
| Factory | {Name}Factory | OrderServiceFactory |
| Test | {ClassName}Test | LoggingOrderServiceDecoratorTest |
abstract class Abstract{Name}Decorator implements {Name}Interface
{
public function __construct(
protected readonly {Name}Interface $wrapped
) {}
public function {operation}({params}): {returnType}
{
return $this->wrapped->{operation}({args});
}
}
final readonly class {Feature}{Name}Decorator extends Abstract{Name}Decorator
{
public function __construct(
{Name}Interface $wrapped,
private {Dependency} $dependency
) {
parent::__construct($wrapped);
}
public function {operation}({params}): {returnType}
{
{beforeBehavior}
$result = parent::{operation}({args});
{afterBehavior}
return $result;
}
}
// Stack decorators in order
$service = new TransactionalOrderServiceDecorator(
new CachingOrderServiceDecorator(
new MetricsOrderServiceDecorator(
new LoggingOrderServiceDecorator(
$baseService,
$logger
),
$metrics
),
$cache
),
$transaction
);
// Use normally - all decorators execute
$order = $service->create($command);
| Decorator | Purpose |
|---|---|
| Logging | Log method calls and results |
| Caching | Cache expensive operations |
| Metrics | Collect performance metrics |
| Transaction | Wrap in database transaction |
| Retry | Retry failed operations |
| CircuitBreaker | Protect from cascading failures |
| Validation | Validate inputs before execution |
| Anti-pattern | Problem | Solution |
|---|---|---|
| Missing Interface | Can't swap decorators | Use shared interface |
| Leaky Abstraction | Decorator-specific methods | Keep interface clean |
| Order Dependency | Wrong stacking order | Document decorator order |
| Heavy Decorators | Too much logic | Keep decorators focused |
| No Abstract | Code duplication | Create abstract decorator |
For complete PHP templates and examples, see:
references/templates.md — Abstract Decorator, Concrete Decorator, Interface templatesreferences/examples.md — Logging, Caching, Metrics, Transaction decorators and testsProvides UI/UX resources: 50+ styles, color palettes, font pairings, guidelines, charts for web/mobile across React, Next.js, Vue, Svelte, Tailwind, React Native, Flutter. Aids planning, building, reviewing interfaces.