use strict; use warnings; package Boilerplater; use base qw( Exporter ); our $VERSION = '0.01'; use Boilerplater::Parcel; 1; =head1 NAME Boilerplater - Bolt OO functionality onto C. =head1 PRIVATE API Boilerplater is an implementation detail. This documentation is partial -- enough for the curious hacker, but not a full API. =head1 DESCRIPTION =head2 Overview. Boilerplater is a small language for describing an object oriented interface, and a compiler which generates some "boilerplate" header code allowing that interface to be used from C. =head2 Object Model =over =item * Single inheritance. =item Method dispatch using virtual tables. =back =head2 Method invocation syntax. Methods are differentiated from functions via capitalization: Dog_say_hello is a function, Dog_Say_Hello is a method. /* Implementing function, in Dog/Chihuahua.c */ void Chihuahua_say_hello(Chihuahua *self) { printf("Yap! Yap! Yap!\n"); Dog_Wag_Tail(self); } /* Implementing function, in Dog/SaintBernard.c. */ void StBernard_say_hello(SaintBernard *self) { printf("Rooorf! Rooorf!\n"); Dog_Wag_Tail(self); } /* Invoke Say_Hello method for several Dog objects. */ void DogPack_greet(DogPack *self) { u32_t i; for (i = 0; i < self->pack_size; i++) { Dog_Say_Hello(self->pack_members[i]); } } =head2 Class declaration syntax [final] [inert] class CLASSNAME [cnick CNICK] [extends PARENT] { [declarations] } Example: class Dog::SaintBernard cnick StBernard extends Dog { void Say_Hello(SaintBernard *self); } =over =item * B - The name of this class. The last string of characters will be used as the objects C struct name. =item * B - A recognizable abbreviation of the class name, used as a prefix for every function and method. =item * B - The full name of the parent class. =back =head2 Memory management At present, memory is managed via a reference counting scheme, but this is not inherently part of Boilerplater. =head2 Namespaces, parcels, prefixes, and "short names" There are two levels of namespacing in Boilerplater: parcels and classes. Boilerplater classes intended to be published as a single unit may be grouped together using a "parcel" (akin to a "package" in Java). Parcel directives need to go at the top of each class file. parcel Crustaceans cnick Crust; All symbols generated by Boilerplater for classes within a parcel will be prefixed by varying capitalizations of the parcel's C-nickname or "cnick" in order to avoid namespace collisions with other projects. Within a parcel, the last part of each class name must be unique. class Crustacean::Lobster::Claw { ... } class Crustacean::Crab::Claw { ... } /* Illegal, "Claw" already used */ "Short names" -- names minus the parcel prefix -- will be auto-generated for all class symbols. When there is no danger of namespace collision, typically because no third-party non-system libraries are being pound-included, the short names can be used after a USE_SHORT_NAMES directive: #define BOIL_USE_SHORT_NAMES The USE_SHORT_NAMES directives do not affect class prefixes, only package prefixes. /* No short names. */ crust_Lobster *lobster = crust_Lobster_new(); /* With short names. */ #define CRUST_USE_SHORT_NAMES Lobster *lobster = Lobster_new(); =head2 Inclusion The boilerplate code is written to a file with whose name is the same as the .bp file, but with an extension of ".h". C code should pound-include "Boiler/Util/Foo.h" for a class defined in "Boiler/Util/Foo.bp". =head1 COPYRIGHT AND LICENSE Copyright 2006-2009 Marvin Humphrey This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =cut