blob: ecb5302931af66ecda472e7484279e64f065207d [file] [log] [blame]
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
use strict;
use warnings;
package Clownfish;
use Clownfish::Base;
our $VERSION = '0.01';
BEGIN {
push @Clownfish::CBlock::ISA, "Clownfish::Base";
push @Clownfish::DocuComment::ISA, "Clownfish::Base";
push @Clownfish::File::ISA, "Clownfish::Base";
push @Clownfish::Parcel::ISA, "Clownfish::Base";
push @Clownfish::Symbol::ISA, "Clownfish::Base";
push @Clownfish::Type::ISA, "Clownfish::Base";
}
use XSLoader;
BEGIN { XSLoader::load( 'Clownfish', '0.01' ) }
1;
=head1 NAME
Clownfish - A small OO language that forms symbiotic relationships with "host"
languages.
=head1 PRIVATE API
Clownfish is an Apache Lucy implementation detail. This documentation is partial --
enough for the curious hacker, but not a full API.
=head1 DESCRIPTION
=head2 Overview.
Clownfish is a small language for declaring an object oriented interface and a
compiler which allows classes to be implemented either in C, in a "host"
language, or a combination of both.
=head2 Why use Clownfish?
=over
=item *
Clownfish-based projects give users the ability to write full subclasses
in any "host" language for which a binding has been prepared.
=item *
Pure C Clownfish class implementations are very fast.
=item *
Users can perform rapid prototyping in their language of choice, then port
their classes to C either for speed or to make them available across multiple
language platforms.
=item *
=back
=head2 Object Model
Clownfish is single-inheritance and class based -- a minimalist design which
makes it as compatible as possible with a broad range of hosts.
Subclasses may be created either at compile time or at run time.
=back
=head2 C method invocation syntax.
Methods are differentiated from functions via capitalization:
Boat_capsize() is a function, Boat_Capsize() is a method.
// Base method.
void
Boat_capsize(Boat *self)
{
self->upside_down = true;
}
// Implementing function, in Boat/Battleship.c
void
Battleship_capsize(Battleship *self)
{
// Superclass method invocation.
Boat_capsize_t capsize = (Boat_capsize_t)SUPER_METHOD(
BATTLESHIP, Battleship, Capsize);
capsize((Boat*)self);
// Subclass-specific behavior.
Battleship_Sink(self);
}
// Implementing function, in Boat/RubberDinghy.c
void
RubDing_capsize(RubberDinghy *self)
{
// Superclass method invocation.
Boat_capsize_t capsize = (Boat_capsize_t)SUPER_METHOD(
RUBBERDINGHY, RubDing, Capsize);
capsize((Boat*)self);
// Subclass-specific behavior.
RubDing_Drift(self);
}
=head2 Class declaration syntax
[final] [inert] class CLASSNAME [cnick CNICK]
[inherits PARENT] [ : ATTRIBUTE ]* {
[declarations]
}
Example:
class Boat::RubberDinghy cnick RubDing inherits Boat {
public inert incremented RubberDinghy*
new();
void
Capsize(RubberDinghy *self);
}
=over
=item * B<CLASSNAME> - The name of this class. The last string of characters
will be used as the object's C struct name.
=item * B<CNICK> - A recognizable abbreviation of the class name, used as a
prefix for every function and method.
=item * B<PARENT> - The full name of the parent class.
=item * B<ATTRIBUTE> - An arbitrary attribute, e.g. "dumpable", or perhaps
"serializable". A class may have multiple attributes, each preceded by a
colon.
=back
=head2 Memory management
At present, memory is managed via a reference counting scheme, but this is not
inherently part of Clownfish.
=head2 Namespaces, parcels, prefixes, and "short names"
There are two levels of namespacing in Clownfish: parcels and classes.
Clownfish classes intended to be published as a single unit may be grouped
together using a "parcel". Parcel directives need to go at the top of each
class file.
parcel Crustacean cnick Crust;
All symbols generated by Clownfish 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 CRUST_USE_SHORT_NAMES
The USE_SHORT_NAMES directives do not affect class prefixes, only parcel
prefixes.
// No short names.
crust_LobsterClaw *claw = crust_LobClaw_new();
// With short names.
#define CRUST_USE_SHORT_NAMES
LobsterClaw *claw = LobClaw_new();
=head2 Inclusion
C header code generated by the Clownfish compiler is written to a file with
whose name is the same as the .cfh file, but with an extension of ".h". C
code should pound-include "Crustacean/Lobster.h" for a class defined in
"Crustacean/Lobster.cfh".
=head1 COPYRIGHT
Clownfish is distributed under the Apache License, Version 2.0, as
described in the file C<LICENSE> included with the distribution.
=cut