Skip to content
← Back to projects

Macroable

A trait to dynamically add methods to a class

#A trait to dynamically add methods to a class

Latest Version on Packagist run-tests Total Downloads

This package provides a trait that, when applied to a class, makes it possible to add methods to that class at runtime.

Here's a quick example:

$myClass = new class() {
    use Spatie\Macroable\Macroable;
};

$myClass::macro('concatenate', function(... $strings) {
   return implode('-', $strings);
});

$myClass->concatenate('one', 'two', 'three'); // returns 'one-two-three'

The idea of a macroable trait and the implementation is taken from the macroable trait of the Laravel framework.

#Support us

We invest a lot of resources into creating best in class open source packages. You can support us by buying one of our paid products.

We highly appreciate you sending us a postcard from your hometown, mentioning which of our package(s) you are using. You'll find our address on our contact page. We publish all received postcards on our virtual postcard wall.

#Installation

You can install the package via composer:

composer require spatie/macroable

#Usage

You can add a new method to a class using macro:

$macroableClass = new class() {
    use Spatie\Macroable\Macroable;
};

$macroableClass::macro('concatenate', function(... $strings) {
   return implode('-', $strings);
});

$macroableClass->concatenate('one', 'two', 'three'); // returns 'one-two-three'

Callables passed to the macro function will be bound to the class

$macroableClass = new class() {
    
    protected $name = 'myName';
    
    use Spatie\Macroable\Macroable;
};

$macroableClass::macro('getName', function() {
   return $this->name;
};

$macroableClass->getName(); // returns 'myName'

You can also add multiple methods in one go by using a mixin class. A mixin class contains methods that return callables. Each method from the mixin will be registered on the macroable class.

$mixin = new class() {
    public function mixinMethod()
    {
       return function() {
          return 'mixinMethod';
       };
    }
    
    public function anotherMixinMethod()
    {
       return function() {
          return 'anotherMixinMethod';
       };
    }
};

$macroableClass->mixin($mixin);

$macroableClass->mixinMethod() // returns 'mixinMethod';

$macroableClass->anotherMixinMethod() // returns 'anotherMixinMethod';

#Changelog

Please see CHANGELOG for more information on what has changed recently.

#Testing

composer test

#Contributing

Please see CONTRIBUTING for details.

#Security

If you've found a bug regarding security please mail security@spatie.be instead of using the issue tracker.

#Postcardware

You're free to use this package (it's MIT-licensed), but if it makes it to your production environment we highly appreciate you sending us a postcard from your hometown, mentioning which of our package(s) you are using.

Our address is: Spatie, Kruikstraat 22, 2018 Antwerp, Belgium.

We publish all received postcards on our company website.

#Credits

Idea and code is taken from the macroable trait of the Laravel framework.

#License

The MIT License (MIT). Please see License File for more information.

New version available.