Padre::Swarm::Geometry - represent connectedness between points


Padre-Plugin-Swarm documentation Contained in the Padre-Plugin-Swarm distribution.

Index


Code Index:

NAME

Top

Padre::Swarm::Geometry - represent connectedness between points

DESCRIPTION

Top

Vaporware.

TODO

Swarm geometry should be very flexible and fetchable incrementally, a geometry walker may find a reference to more geometry that is unknown to it, later if that geometry arrives in the swarm it may be connected to any existing swarm geometries that refer to it.


Padre-Plugin-Swarm documentation Contained in the Padre-Plugin-Swarm distribution.

package Padre::Swarm::Geometry;

use strict;
use warnings;
use Params::Util qw( _INSTANCE );
use Padre::Logger;
use Graph;
use Graph::Directed;
use Class::XSAccessor 
    accessors => {
	graph => 'graph',
    };
our $VERSION = '0.1';

sub new {
	my $class = shift;
	my %args = @_;
	$args{graph} ||= new Graph::Directed
	    unless _INSTANCE( $args{graph}, 'Graph::Directed' );
	
	return bless \%args, ref($class) || $class;
}

sub plugin {
    return Padre::Plugin::Swarm->instance;
}

sub get_users {
	my $self = shift;
	return $self->graph->successors( '~identity' );
	
}


sub enable {}
sub disable {}

*on_recv = \&On_SwarmMessage;

sub On_SwarmMessage {
    my ($self,$message) = @_;
    my $handler = 'accept_'  . $message->{type};
    if ( $self->can($handler) ) {
		TRACE( "Geometry handler $handler" ) if DEBUG;
		eval { $self->$handler($message) } ;
		if ( $@ ) {
			TRACE( "Geometry handler error - $@" ) if DEBUG;
		}
    } else {
		TRACE( "Ignored " . $message->type ) if DEBUG;
		
	}
}

sub accept_promote {
	my $self = shift;
	my $message = shift;
	$self->graph->add_edge( '~service' => $message->{service} );
	#$self->graph->add_edge( $message->{service} , $message->{from} );
	# just in case
	$self->graph->add_edge( '~identity' => $message->{from} );
	
	if ($message->{resource}) {
		$self->graph->add_edge( 
			$message->{from} , 
			':' . $message->{resource} );
	}
	

}

sub accept_destroy {
	my $self = shift;
	my $message = shift;
        return unless $message->{resource};
	$self->graph->delete_edge( $message->{from} ,
		':' . $message->{resource}
	);
		
	$self->graph->delete_edge( ':' . $message->{resource} ,
		$message->{service}
	);
	
}


sub accept_disco {
	my $self = shift;
	my $message = shift;
	my $g = $self->graph;
	# TODO - if this disco is targeted to us do something interesting
}

sub accept_announce {
	my $self = shift;
	my $message = shift;
	$self->graph->add_edge( '~identity' => $message->{from} );
	if ( exists $message->{resource} ) {
		$self->graph->add_edge( 
		    $message->{from} ,
		    $message->{resource},
		)
	}
	
}

sub accept_leave {
	my $self = shift;
	my $message = shift;
	my @s = $self->graph->successors( $message->{from} );
	$self->graph->delete_vertex( $_ )
	    for @s, $message->{from};
	
	
}


sub TO_JSON {
	
}

sub FROM_JSON {
	
}

1;