---
name: "Class::MakeMethods::Composite::Universal"
section: "3pm"
platform: "linux"
package: "libclass-makemethods-perl"
version: "1.01-7"
release: "Debian 13 (Trixie)"
platforms: ["linux"]
url: "https://new.carta.tech/Class::MakeMethods::Composite::Universal"
---

# Class::MakeMethods::Composite::Universal(3pm)

Composite Method Tricks

## NAME

Class::MakeMethods::Composite::Universal - Composite Method Tricks

## SYNOPSIS

```
  Class::MakeMethods::Composite::Universal->make_patch(
    -TargetClass => 'SomeClass::OverYonder',
    name => 'foo',
    pre_rules => [
      sub {
        my $method = pop;
        warn "Arguments for foo:", @_
      }
    ]
    post_rules => [
      sub {
        warn "Result of foo:", Class::MakeMethods::Composite->CurrentResults
      }
    ]
  );
```

## DESCRIPTION

The Composite::Universal suclass of MakeMethods provides some generally-applicable types of methods based on Class::MakeMethods::Composite.

## METHOD GENERATOR TYPES

### patch

The patch ruleset generates composites whose core behavior is based on an existing subroutine.

Here's a sample usage:

```
  sub foo {
    my $count = shift;
    return 'foo' x $count;
  }

  Class::MakeMethods::Composite::Universal->make(
    -ForceInstall => 1,
    patch => {
      name => 'foo',
      pre_rules => [
        sub {
          my $method = pop @_;
          if ( ! scalar @_ ) {
            @{ $method->{args} } = ( 2 );
          }
        },
        sub {
          my $method = pop @_;
          my $count = shift;
          if ( $count > 99 ) {
            Carp::confess "Won't foo '$count' -- that's too many!"
          }
        },
      ],
      post_rules => [
        sub {
          my $method = pop @_;
          if ( ref $method->{result} eq 'SCALAR' ) {
            ${ $method->{result} } =~ s/oof/oozle-f/g;
          } elsif ( ref $method->{result} eq 'ARRAY' ) {
            map { s/oof/oozle-f/g } @{ $method->{result} };
          }
        }
      ],
    },
  );
```

### make\_patch

A convenient wrapper for `"make()"` and the `"patch"` method generator.

Provides the '-ForceInstall' flag, which is required to ensure that the patched subroutine replaces the original.

For example, one could add logging to an existing method as follows:

```
  Class::MakeMethods::Composite::Universal->make_patch(
    -TargetClass => 'SomeClass::OverYonder',
    name => 'foo',
    pre_rules => [
      sub {
        my $method = pop;
        warn "Arguments for foo:", @_
      }
    ]
    post_rules => [
      sub {
        warn "Result of foo:", Class::MakeMethods::Composite->CurrentResults
      }
    ]
  );
```

## SEE ALSO

See Class::MakeMethods for general information about this distribution.

See Class::MakeMethods::Composite for more about this family of subclasses.
