instance ... def __init__(self, value): ... print("Initialising instance...") ... self.payload = value >>> exampleInstance = ExampleClass(42) Creating new instance... Initialising instance... >>> print(exampleInstance.payload) 42 Classes normally act as factories for new instances of themselves, that is, a class is a callable object (like a function), with the call being the constructor, and calling the class returns an instance of that class. However the __new__ method is permitted to return something other than an instance of the class for specialised purposes. In that case, the __init__ is not invoked. Raku With Raku, even more boilerplate can be left out, given that a default new method is inherited, attributes can be specified, as well as whether they can be set, reset, or are required. In addition, any extra constructor functionality can be included in a BUILD method which will get called to allow for custom initialization. A TWEAK method can be specified to post-process any attributes already (implicitly) initialized. class Person { has Str $.first-name is required; # First name (a string) can only be set at # construction time (the . means "public"). has Str $.last-name is required; # Last name (a string) can only be set at # construction time (a ! would mean "private"). has Int $.age is rw; # Age (an integer) can be modified after # construction ('rw'), and is not required # during the object instantiation. # Create a 'full-name' method which returns the person's full name. # This method can be accessed outside the class. method full-name { $!first-name.tc ~ " " ~ $!last-name.tc } # Create a 'has-age' method which returns true if age has been set. # This method is used only inside the class so it's declared as "private" # by prepending its name with a ! method !has-age { self.age.defined } # Check custom requirements method TWEAK { if self!has-age && $!age < 18 { # No under 18 die "No person under 18"; } } } The Person class is instantiated like this: my $p0 = Person.new( first-name => 'Sam', last-name => 'Ashe', age => 42 ); my $p1 = Person.new( first-name => 'grace', last-name => 'hopper' ); say $p1.full-name(); # OUTPUT: «Grace Hopper␤» Alternatively, the named parameters can be specified using the colon-pair syntax in Perl 6: my $p0 = Person.new( :first-name<Sam>, :last-name<Ashe>, :age(42) ); my $p1 = Person.new( :first-name<Grace>, :last-name<Hopper> ); And should you have set up variables