Index: lemon/smart_graph.h
===================================================================
--- lemon/smart_graph.h	(revision 2123)
+++ lemon/smart_graph.h	(revision 2128)
@@ -98,38 +98,4 @@
     int maxEdgeId() const { return edges.size()-1; }
 
-    Node source(Edge e) const { return edges[e.n].source; }
-    Node target(Edge e) const { return edges[e.n].target; }
-
-    /// Node ID.
-    
-    /// The ID of a valid Node is a nonnegative integer not greater than
-    /// \ref maxNodeId(). The range of the ID's is not surely continuous
-    /// and the greatest node ID can be actually less then \ref maxNodeId().
-    ///
-    /// The ID of the \ref INVALID node is -1.
-    ///\return The ID of the node \c v. 
-    static int id(Node v) { return v.n; }
-    /// Edge ID.
-    
-    /// The ID of a valid Edge is a nonnegative integer not greater than
-    /// \ref maxEdgeId(). The range of the ID's is not surely continuous
-    /// and the greatest edge ID can be actually less then \ref maxEdgeId().
-    ///
-    /// The ID of the \ref INVALID edge is -1.
-    ///\return The ID of the edge \c e. 
-    static int id(Edge e) { return e.n; }
-
-    /// \brief Returns the node from its \c id.
-    ///
-    /// Returns the node from its \c id. If there is not node
-    /// with the given id the effect of the function is undefinied.
-    static Node nodeFromId(int id) { return Node(id);}
-
-    /// \brief Returns the edge from its \c id.
-    ///
-    /// Returns the edge from its \c id. If there is not edge
-    /// with the given id the effect of the function is undefinied.
-    static Edge edgeFromId(int id) { return Edge(id);}
-
     Node addNode() {
       Node n; n.n=nodes.size();
@@ -148,9 +114,38 @@
     }
 
-    void clear() {
-      edges.clear();
-      nodes.clear();
-    }
-
+
+    Node source(Edge e) const { return edges[e.n].source; }
+    Node target(Edge e) const { return edges[e.n].target; }
+
+    /// Node ID.
+    
+    /// The ID of a valid Node is a nonnegative integer not greater than
+    /// \ref maxNodeId(). The range of the ID's is not surely continuous
+    /// and the greatest node ID can be actually less then \ref maxNodeId().
+    ///
+    /// The ID of the \ref INVALID node is -1.
+    ///\return The ID of the node \c v. 
+    static int id(Node v) { return v.n; }
+    /// Edge ID.
+    
+    /// The ID of a valid Edge is a nonnegative integer not greater than
+    /// \ref maxEdgeId(). The range of the ID's is not surely continuous
+    /// and the greatest edge ID can be actually less then \ref maxEdgeId().
+    ///
+    /// The ID of the \ref INVALID edge is -1.
+    ///\return The ID of the edge \c e. 
+    static int id(Edge e) { return e.n; }
+
+    /// \brief Returns the node from its \c id.
+    ///
+    /// Returns the node from its \c id. If there is not node
+    /// with the given id the effect of the function is undefinied.
+    static Node nodeFromId(int id) { return Node(id);}
+
+    /// \brief Returns the edge from its \c id.
+    ///
+    /// Returns the edge from its \c id. If there is not edge
+    /// with the given id the effect of the function is undefinied.
+    static Edge edgeFromId(int id) { return Edge(id);}
 
     class Node {
@@ -217,14 +212,4 @@
     }
 
-    Node _split(Node n, bool connect = true)
-    {
-      Node b = addNode();
-      nodes[b.n].first_out=nodes[n.n].first_out;
-      nodes[n.n].first_out=-1;
-      for(int i=nodes[b.n].first_out;i!=-1;i++) edges[i].source=b.n;
-      if(connect) addEdge(n,b);
-      return b;
-    }
-
   };
 
@@ -252,4 +237,16 @@
     friend class Snapshot;
 
+  private:
+    ///SmartGraph is \e not copy constructible. Use GraphCopy() instead.
+
+    ///SmartGraph is \e not copy constructible. Use GraphCopy() instead.
+    ///
+    SmartGraph(const SmartGraph &) :ExtendedSmartGraphBase() {};
+    ///\brief Assignment of SmartGraph to another is \e not allowed.
+    ///Use GraphCopy() instead.
+
+    ///Assignment of SmartGraph to another is \e not allowed.
+    ///Use GraphCopy() instead.
+    void operator=(const SmartGraph &) {}
   protected:
     void restoreSnapshot(const Snapshot &s)
@@ -269,4 +266,34 @@
 
   public:
+    
+    /// Constructor
+    
+    /// Constructor.
+    ///
+    SmartGraph() {};
+    
+    ///Add a new node to the graph.
+    
+    /// \return the new node.
+    ///
+    Node addNode() { return Parent::addNode(); }
+    
+    ///Add a new edge to the graph.
+    
+    ///Add a new edge to the graph with source node \c s
+    ///and target node \c t.
+    ///\return the new edge.
+    Edge addEdge(const Node& s, const Node& t) { 
+      return Parent::addEdge(s, t); 
+    }
+
+    ///\e
+    
+    ///\bug Undocumented
+    ///\bug Doesn't destruct the maps.
+    void clear() {
+      edges.clear();
+      nodes.clear();
+    }
 
     ///Split a node.
@@ -285,10 +312,13 @@
     ///feature.
     ///\todo It could be implemented in a bit faster way.
-    Node split(Node n, bool connect = true) 
+    Node split(Node n, bool connect = true)
     {
-      Node b = _split(n,connect);
+      Node b = addNode();
+      nodes[b.n].first_out=nodes[n.n].first_out;
+      nodes[n.n].first_out=-1;
+      for(int i=nodes[b.n].first_out;i!=-1;i++) edges[i].source=b.n;
+      if(connect) addEdge(n,b);
       return b;
     }
-  
 
     ///Class to make a snapshot of the graph and to restrore to it later.
@@ -377,4 +407,22 @@
   ///
   class SmartUGraph : public ExtendedSmartUGraphBase {
+  private:
+    ///SmartUGraph is \e not copy constructible. Use UGraphCopy() instead.
+
+    ///SmartUGraph is \e not copy constructible. Use UGraphCopy() instead.
+    ///
+    SmartUGraph(const SmartUGraph &) : ExtendedSmartUGraphBase() {};
+    ///\brief Assignment of SmartUGraph to another is \e not allowed.
+    ///Use UGraphCopy() instead.
+
+    ///Assignment of SmartUGraph to another is \e not allowed.
+    ///Use UGraphCopy() instead.
+    void operator=(const SmartUGraph &) {}
+  public:
+    /// Constructor
+    
+    /// Constructor.
+    ///
+    SmartUGraph() {}
   };
 
