Claude-skill-registry acc-create-decorator

Generates Decorator pattern for PHP 8.5. Creates wrapper classes for dynamic behavior addition without inheritance. Includes unit tests.

install
source · Clone the upstream repo
git clone https://github.com/majiayu000/claude-skill-registry
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/majiayu000/claude-skill-registry "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/data/acc-create-decorator" ~/.claude/skills/majiayu000-claude-skill-registry-acc-create-decorator && rm -rf "$T"
manifest: skills/data/acc-create-decorator/SKILL.md
source content

Decorator Pattern Generator

Creates Decorator pattern infrastructure for dynamically adding behavior to objects.

When to Use

ScenarioExample
Cross-cutting concernsLogging, caching, metrics
Transparent wrappingAdd behavior without changing interface
Stackable featuresMultiple decorators combined
Runtime behaviorDynamic feature addition

Component Characteristics

Component Interface

  • Defines core operations
  • Shared by concrete and decorators
  • Enables transparent wrapping

Abstract Decorator

  • Wraps component
  • Delegates to wrapped object
  • Base for concrete decorators

Concrete Decorators

  • Add specific behavior
  • Before/after wrapped call
  • Can be stacked

Generation Process

Step 1: Generate Component Interface

Path:

src/Domain/{BoundedContext}/

  1. {Name}Interface.php
    — Core operations contract

Step 2: Generate Abstract Decorator

Path:

src/Domain/{BoundedContext}/Decorator/

  1. Abstract{Name}Decorator.php
    — Base decorator with delegation

Step 3: Generate Concrete Decorators

Path:

src/Infrastructure/{BoundedContext}/Decorator/

  1. Logging{Name}Decorator.php
    — Logging behavior
  2. Caching{Name}Decorator.php
    — Caching behavior
  3. Metrics{Name}Decorator.php
    — Performance metrics
  4. Transactional{Name}Decorator.php
    — Transaction wrapping

Step 4: Generate Factory (Optional)

Path:

src/Infrastructure/{BoundedContext}/

  1. {Name}Factory.php
    — Stack decorators in correct order

Step 5: Generate Tests

  1. {Feature}{Name}DecoratorTest.php
    — Individual decorator tests

File Placement

ComponentPath
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/

Naming Conventions

ComponentPatternExample
Interface
{Name}Interface
OrderServiceInterface
Abstract Decorator
Abstract{Name}Decorator
AbstractOrderServiceDecorator
Concrete Decorator
{Feature}{Name}Decorator
LoggingOrderServiceDecorator
Factory
{Name}Factory
OrderServiceFactory
Test
{ClassName}Test
LoggingOrderServiceDecoratorTest

Quick Template Reference

Abstract Decorator

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});
    }
}

Concrete Decorator

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;
    }
}

Usage Example

// 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);

Common Decorators

DecoratorPurpose
LoggingLog method calls and results
CachingCache expensive operations
MetricsCollect performance metrics
TransactionWrap in database transaction
RetryRetry failed operations
CircuitBreakerProtect from cascading failures
ValidationValidate inputs before execution

Anti-patterns to Avoid

Anti-patternProblemSolution
Missing InterfaceCan't swap decoratorsUse shared interface
Leaky AbstractionDecorator-specific methodsKeep interface clean
Order DependencyWrong stacking orderDocument decorator order
Heavy DecoratorsToo much logicKeep decorators focused
No AbstractCode duplicationCreate abstract decorator

References

For complete PHP templates and examples, see:

  • references/templates.md
    — Abstract Decorator, Concrete Decorator, Interface templates
  • references/examples.md
    — Logging, Caching, Metrics, Transaction decorators and tests